/*!
 * \file ParserAdapter.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 行情解析器适配器头文件
 * 
 * 本文件定义了行情解析器适配器相关的类和接口，
 * 包括行情解析器适配器类ParserAdapter和适配器管理器ParserAdapterMgr。
 * 提供统一的行情数据接收、处理和分发功能，支持多种行情源的接入。
 */
#pragma once
#include <memory>
#include <boost/core/noncopyable.hpp>

#include "../Includes/FasterDefs.h"
#include "../Includes/IParserApi.h"


NS_WTP_BEGIN
class WTSVariant;
class IHotMgr;

/**
 * @class IParserStub
 * @brief 行情解析器存根接口
 * 
 * 定义行情数据处理的回调接口，用于接收和处理各种类型的行情数据。
 * 包括实时行情、委托队列、委托明细、成交明细等数据的处理。
 */
class IParserStub
{
public:
	/**
	 * @brief 处理推送的行情数据
	 * 
	 * @param curTick 当前Tick数据
	 * @param hotFlag 热点标志，默认为0
	 */
	virtual void			handle_push_quote(WTSTickData* curTick, uint32_t hotFlag = 0){}

	/**
	 * @brief 处理推送的委托明细数据
	 * 
	 * @param curOrdDtl 当前委托明细数据
	 */
	virtual void			handle_push_order_detail(WTSOrdDtlData* curOrdDtl){}
	
	/**
	 * @brief 处理推送的委托队列数据
	 * 
	 * @param curOrdQue 当前委托队列数据
	 */
	virtual void			handle_push_order_queue(WTSOrdQueData* curOrdQue) {}
	
	/**
	 * @brief 处理推送的成交明细数据
	 * 
	 * @param curTrans 当前成交明细数据
	 */
	virtual void			handle_push_transaction(WTSTransData* curTrans) {}
};

/**
 * @class ParserAdapter
 * @brief 行情解析器适配器类
 * 
 * 行情解析器适配器，继承自IParserSpi接口，实现行情数据的接收和处理。
 * 
 * 主要功能包括：
 * - 行情解析器的初始化和管理
 * - 行情数据的接收和预处理
 * - 合约过滤和交易所过滤
 * - 行情数据的转发和分发
 * - Level2数据处理（委托队列、委托明细、成交明细）
 * - 热点合约管理
 * - 日志记录和错误处理
 * 
 * @note 该类不可复制
 * @see IParserSpi, IParserApi, IParserStub
 */
class ParserAdapter : public IParserSpi,
					private boost::noncopyable
{
public:
	/**
	 * @brief 构造函数
	 * 
	 * 初始化行情解析器适配器
	 */
	ParserAdapter();
	
	/**
	 * @brief 析构函数
	 * 
	 * 清理资源
	 */
	~ParserAdapter();

public:
	/**
	 * @brief 初始化适配器
	 * 
	 * 通过配置文件初始化行情解析器适配器
	 * 
	 * @param id 适配器ID
	 * @param cfg 配置参数
	 * @param stub 行情处理存根
	 * @param bgMgr 基础数据管理器
	 * @param hotMgr 热点管理器，可选
	 * @return 是否初始化成功
	 */
	bool	init(const char* id, WTSVariant* cfg, IParserStub* stub, IBaseDataMgr* bgMgr, IHotMgr* hotMgr = NULL);

	/**
	 * @brief 扩展初始化适配器
	 * 
	 * 通过外部API实例初始化行情解析器适配器
	 * 
	 * @param id 适配器ID
	 * @param api 行情解析器API实例
	 * @param stub 行情处理存根
	 * @param bgMgr 基础数据管理器
	 * @param hotMgr 热点管理器，可选
	 * @return 是否初始化成功
	 */
	bool	initExt(const char* id, IParserApi* api, IParserStub* stub, IBaseDataMgr* bgMgr, IHotMgr* hotMgr = NULL);

	/**
	 * @brief 释放资源
	 * 
	 * 释放适配器占用的所有资源
	 */
	void	release();

	/**
	 * @brief 运行适配器
	 * 
	 * 启动行情解析器适配器
	 * 
	 * @return 是否启动成功
	 */
	bool	run();

	/**
	 * @brief 获取适配器ID
	 * 
	 * @return 适配器ID字符串
	 */
	const char* id() const{ return _id.c_str(); }

public:
	/**
	 * @brief 处理合约列表
	 * 
	 * 处理从行情源接收到的合约列表
	 * 
	 * @param aySymbols 合约符号数组
	 */
	virtual void handleSymbolList(const WTSArray* aySymbols) override {}

	/**
	 * @brief 处理实时行情数据
	 * 
	 * 处理从行情源接收到的实时Tick数据
	 * 
	 * @param quote 实时行情数据
	 * @param procFlag 处理标志
	 */
	virtual void handleQuote(WTSTickData *quote, uint32_t procFlag) override;

	/**
	 * @brief 处理委托队列数据
	 * 
	 * 处理Level2委托队列数据（股票level2等）
	 * 
	 * @param ordQueData 委托队列数据
	 */
	virtual void handleOrderQueue(WTSOrdQueData* ordQueData) override;

	/**
	 * @brief 处理委托明细数据
	 * 
	 * 处理Level2委托明细数据（股票level2等）
	 * 
	 * @param ordDetailData 委托明细数据
	 */
	virtual void handleOrderDetail(WTSOrdDtlData* ordDetailData) override;

	/**
	 * @brief 处理成交明细数据
	 * 
	 * 处理Level2成交明细数据
	 * 
	 * @param transData 成交明细数据
	 */
	virtual void handleTransaction(WTSTransData* transData) override;

	/**
	 * @brief 处理解析器日志
	 * 
	 * 处理来自行情解析器的日志信息
	 * 
	 * @param ll 日志级别
	 * @param message 日志消息
	 */
	virtual void handleParserLog(WTSLogLevel ll, const char* message) override;

	/**
	 * @brief 获取基础数据管理器
	 * 
	 * @return 基础数据管理器指针
	 */
	virtual IBaseDataMgr* getBaseDataMgr() override { return _bd_mgr; }


private:
	IParserApi*			_parser_api;		/**< 行情解析器API指针 */
	FuncDeleteParser	_remover;			/**< 解析器删除函数 */

	bool				_stopped;			/**< 是否已停止 */

	typedef faster_hashset<LongKey>	ExchgFilter;
	ExchgFilter			_exchg_filter;		/**< 交易所过滤器 */
	ExchgFilter			_code_filter;		/**< 合约代码过滤器 */
	IBaseDataMgr*		_bd_mgr;			/**< 基础数据管理器 */
	IHotMgr*			_hot_mgr;			/**< 热点管理器 */
	IParserStub*		_stub;				/**< 行情处理存根 */
	WTSVariant*			_cfg;				/**< 配置参数 */
	std::string			_id;				/**< 适配器ID */
};

typedef std::shared_ptr<ParserAdapter>	ParserAdapterPtr;
typedef faster_hashmap<std::string, ParserAdapterPtr>	ParserAdapterMap;

/**
 * @class ParserAdapterMgr
 * @brief 行情解析器适配器管理器
 * 
 * 管理多个行情解析器适配器的生命周期和运行状态。
 * 提供适配器的添加、获取、运行和释放功能。
 * 
 * @note 该类不可复制
 */
class ParserAdapterMgr : private boost::noncopyable
{
public:
	/**
	 * @brief 释放所有适配器
	 * 
	 * 释放管理器中所有适配器的资源
	 */
	void	release();

	/**
	 * @brief 运行所有适配器
	 * 
	 * 启动管理器中所有适配器
	 */
	void	run();

	/**
	 * @brief 获取指定适配器
	 * 
	 * @param id 适配器ID
	 * @return 适配器智能指针
	 */
	ParserAdapterPtr getAdapter(const char* id);

	/**
	 * @brief 添加适配器
	 * 
	 * @param id 适配器ID
	 * @param adapter 适配器智能指针
	 * @return 是否添加成功
	 */
	bool	addAdapter(const char* id, ParserAdapterPtr& adapter);


public:
	ParserAdapterMap _adapters;		/**< 适配器映射表 */
};

NS_WTP_END